﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;
using Telerik.WinControls.UI;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmProdutosCliente : OwnZForm
    {
        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------
        private bool _alterado;

        private bool carregado;

        private int _cliente;

        public FrmProdutosCliente()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        private void FrmProdutosCliente_Load(object sender, EventArgs e)
        {
            carregado = false;
            cmbCliente.DataSource = Contexto.Db.tbClientes.ToList();
            cmbCliente.DisplayMember = "desCliente";
            cmbCliente.ValueMember = "idCliente";
            cmbCliente.DropDownListElement.AutoCompleteSuggest.SuggestMode = SuggestMode.Contains;

            cmbCliente.SelectedIndex = 0;

            _cliente = cmbCliente.SelectedValue.ParaInt();

            AtualizarGrid();

            Contexto.MainForm.Cursor = Cursors.Arrow;

            _alterado = false;
            carregado = true;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------
        

        private void gvProdutos_CellValidating(object sender, Telerik.WinControls.UI.CellValidatingEventArgs e)
        {
            if (e.Column.Name != "ValorCliente" || e.OldValue.ParaDecimal() == e.Value.ParaDecimal())
                return;

            _alterado = true;
        }

        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
            Close();
        }

        private void cmdSalvareContinuar_Click(object sender, EventArgs e)
        {
            Salvar();
        }

        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void FrmProdutosCliente_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!_alterado)
                return;

            var res = Contexto.MainForm.ExibirMensagemSairSemSalvar();

            if (res != DialogResult.Yes)
            {
                e.Cancel = true;
                return;
            }

            Dispose();
        }

        private void gvProdutos_CellValueChanged(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
        {
            if (e.Column.Name != "ValorCliente")
                return;

            if (e.Value.ParaDecimal() != 0)
                return;

            var pc = (RecProdutoCliente)e.Row.DataBoundItem;

            if (pc.ValorGrupoCliente == 0)
                return;

            gvProdutos.EditorManager.ActiveEditor.Value = pc.ValorCliente = pc.ValorGrupoCliente;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------
        private void AtualizarGrid()
        {
            if (_alterado)
                return;

            Cursor = Cursors.WaitCursor;

            var lProdutos = new List<RecProdutoCliente>();

            Contexto.Db.tbProdutoes.ToList().ForEach(p => lProdutos.Add(new RecProdutoCliente
            {
                IdProduto = p.idProduto,
                IdCliente = _cliente,
                DesNome = p.desNomeProduto,
                DesNomeGrupo = p.tbGrupoProduto.desNomeGrupo,
                IdGrupo = p.tbGrupoProduto.idGrupo,
                Valor = p.valPrecoProduto == 0 ? p.tbGrupoProduto.valPrecoPadrao : p.valPrecoProduto
            }));

            var lgpc = Contexto.Db.tbGrupoProdutoClientes.Where(gpc => gpc.idCliente == _cliente);

            if (lgpc.Count() != 0)
            {
                lgpc.ToList().ForEach(gpc =>
                {
                    var p = lProdutos.First(rgp => rgp.IdGrupo == gpc.idGrupoProduto);

                    p.ValorCliente = p.ValorGrupoCliente = gpc.valPrecoGrupoProdutoCliente;
                });
            }

            var lpc = Contexto.Db.tbProdutoClientes.Where(pc => pc.idCliente == _cliente);

            if (lpc.Count() != 0)
            {
                lpc.ToList().ForEach(pc =>
                {
                    var p = lProdutos.First(rp => rp.IdProduto == pc.idProduto);

                    p.ValorCliente = pc.valPrecoProdutoCliente;
                });
            }

            gvProdutos.DataSource = lProdutos;

            Cursor = Cursors.Arrow;
        }

        public void Salvar()
        {
            var lProdutos = (List<RecProdutoCliente>)gvProdutos.DataSource;

            lProdutos.Where(p => p.ValorCliente == 0 || p.ValorCliente == p.ValorGrupoCliente).ToList().ForEach(rgc =>
            {
                var pc = Contexto.Db.tbProdutoClientes.
                        FirstOrDefault(tpc => tpc.idCliente == rgc.IdCliente && tpc.idProduto == rgc.IdProduto);

                if (pc != null)
                    Contexto.Db.tbProdutoClientes.DeleteObject(pc);
            });

            lProdutos.Where(p => p.ValorCliente != 0 && p.ValorCliente != p.ValorGrupoCliente).ToList().ForEach(rpc =>
            {
                var pc = Contexto.Db.tbProdutoClientes.
                        FirstOrDefault(tpc => tpc.idCliente == rpc.IdCliente && tpc.idProduto == rpc.IdProduto);

                if (pc == null)
                {
                    pc = new tbProdutoCliente
                    {
                        idCliente = rpc.IdCliente,
                        idProduto = rpc.IdProduto
                    };

                    Contexto.Db.tbProdutoClientes.AddObject(pc);
                }

                pc.valPrecoProdutoCliente = rpc.ValorCliente;
            });

            Contexto.Db.SaveChanges();

            _alterado = false;
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        private void cmbCliente_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            if (!carregado)
                return;
            if (_cliente == cmbCliente.SelectedValue.ParaInt())
                return;

            if (_alterado)
            {
                var res = Contexto.MainForm.ExibirMensagem("Os valores alterados serão perdidos, deseja continuar sem salvar?",
                                                 MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (res == DialogResult.Yes)
                    _alterado = false;
                else
                    cmbCliente.SelectedValue = _cliente;
            }

            _cliente = cmbCliente.SelectedValue.ParaInt();

            AtualizarGrid();
        }
    }
}
